<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>责任链模式</title>
</head>
<body>
	<h1>责任链模式</h1>
</body>
<script type="text/javascript">

    // 优点：1. 解耦了请求发送者和N个接收者之间的复杂关系，不需要知道链中那个节点能处理你的请求，所以你只需要把请求传递到第一个节点即可。
    //       2. 链中的节点对象可以灵活地拆分重组，增加或删除一个节点，或者改变节点的位置都是很简单的事情。
    //       3. 我们还可以手动指定节点的起始位置，并不是说非得要从其实节点开始传递的.

    // 缺点：职责链模式中多了一点节点对象，可能在某一次请求过程中，大部分节点没有起到实质性作用。
    
    // 他们的作用只是让请求传递下去，从性能方面考虑，避免过长的职责链提高性能

    function order500(orderType,isPay,count){
        if(orderType == 1 && isPay == true)    {
            console.log("亲爱的用户，您中奖了100元红包了");
        }else {
            //我不知道下一个节点是谁,反正把请求往后面传递
            return "nextSuccessor";
        }
    };
    function order200(orderType,isPay,count) {
        if(orderType == 2 && isPay == true) {
            console.log("亲爱的用户，您中奖了20元红包了");
        }else {
            //我不知道下一个节点是谁,反正把请求往后面传递
            return "nextSuccessor";
        }
    };
    function orderNormal(orderType,isPay,count){
        // 普通用户来处理中奖信息
        if(count > 0) {
            console.log("亲爱的用户，您已抽到10元优惠卷");
        }else {
            console.log("亲爱的用户，请再接再厉哦");
        }
    }
    // 下面需要编写职责链模式的封装构造函数方法
    var Chain = function(fn){
        this.fn = fn;
        this.successor = null;
    };
    Chain.prototype.setNextSuccessor = function(successor){
        return this.successor = successor;
    }
    // 把请求往下传递
    Chain.prototype.passRequest = function(){
        var ret = this.fn.apply(this,arguments);
        if(ret === 'nextSuccessor') {
            return this.successor && this.successor.passRequest.apply(this.successor,arguments);
        }
        return ret;
    }
    //现在我们把3个函数分别包装成职责链节点：
    var chainOrder500 = new Chain(order500);
    var chainOrder200 = new Chain(order200);
    var chainOrderNormal = new Chain(orderNormal);

    // 然后指定节点在职责链中的顺序
    chainOrder500.setNextSuccessor(chainOrder200);
    chainOrder200.setNextSuccessor(chainOrderNormal);

    //最后把请求传递给第一个节点：
    chainOrder500.passRequest(1,true,500);  // 亲爱的用户，您中奖了100元红包了
    chainOrder500.passRequest(2,true,500);  // 亲爱的用户，您中奖了20元红包了
    chainOrder500.passRequest(3,true,500);  // 亲爱的用户，您已抽到10元优惠卷 
    chainOrder500.passRequest(1,false,0);   // 亲爱的用户，请再接再厉哦
</script>
</html>